﻿#ifndef _BYTEBUFFER_
#define _BYTEBUFFER_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;

typedef unsigned char BYTE;
#define INCREASESIZE 128

//这个类的局限性：只能按照包的格式一项一项存放数据和读取数据。

//内部会有一个读写指针，指示读写位置。
//读写指针位置原则：
//写指针：总是在数据的最后，已经指到缓冲区最后，不会重置到开头，因为这一个类只保存一个数据包。
//读指针：未读时放在最前，读过则后移，读完则重置到开头

//resize会保存原有数据，缓冲区长度也会变化,写指针会在数据的最后，读指针指向数据开头。
class CJSByteArray
{
public:
	CJSByteArray();
	CJSByteArray(const CJSByteArray &byteArr);
	CJSByteArray(int nLen);
	~CJSByteArray();

	int PutInt(int n);
	int PutShort(short n);
	int PutLong(long n);
	int PutString(char str[], int nLen);
	int PutByte(BYTE byte[], int nLen);
	int PutByte(BYTE byte);

	int GetInt();
	short GetShort();
	long GetLong();
	char* GetString(int nLen);
	int GetByte(BYTE byte[], int nLen);
	int GetByte(BYTE &byte);

	//放入整个数据包，取整个数据包
	//把从网络上接收到的数据包放到ByteArray中，返回放入的长度,可以重复放入
	int PutData(char str[], int nLen);
	char* GetData(void);

	//释放上次申请的内存，重新申请n大小内存
	int Resize(int n);

	//TLV的总长度
	int Length(void);

	//清除数据，不释放内存
	int Clear(void);
	//int Destroy(void);

	int End(void);

	int GetT(void);
	int GetL(void);

	void UnpackBegin(void);
	CJSByteArray& operator=(const CJSByteArray& byteArr);

private:
	int GetValidSize(void);
	bool EnoughGet(int size);


private:
	BYTE *m_pBuffer;
	BYTE *m_pCurrentWritePos;
	BYTE *m_pCurrentReadPos;

	char *p;

	int m_nLength;		//buffer里面数据的长度
	int m_nBufferSize;	//buffer的总长度
};


#endif //_BYTEBUFFER_
